WM_MOUSELEAVE
Otázka od: Sula Milos
10. 10. 2002 9:16
Nevite nekdo zda se daji messages pro VCL komponenty zachytavat i primo
v projektu bez toho aniz bych dopisoval obsluzny event primo do te
komponenty ? Napriklad mam na formu komponentu TImage a chci v aplikaci
odchytit zpravu WM_MOUSELEAVE, ktera neni standartne obsluhovana
komponentou (samozrejme po aktivaci pomoci trackmouseevent API funkci).
Milos
Odpovedá: Blazek Jaroslav
10. 10. 2002 20:05
Ahoj,
> milos.sula@oku-su.cz 10.10.02 9:15 >>>
>Nevite nekdo zda se daji messages pro VCL komponenty zachytavat i primo
>v projektu bez toho aniz bych dopisoval obsluzny event primo do te
>komponenty ? Napriklad mam na formu komponentu TImage a chci v aplikaci
>odchytit zpravu WM_MOUSELEAVE, ktera neni standartne obsluhovana
>komponentou (samozrejme po aktivaci pomoci trackmouseevent API funkci).
no nevim.....ale pro TImage asi WM_MOUSELEAVE neudelas, protoze to neni okno
(nema Handle:HWND)
pokud bude na nejakem Panelu (TImage - alClient), tak potom se necha
WM_MOUSELEAVE udelat na ten Panel
zkusil jsem si jen takovu zbesilost na jeden Panel, ale samozrejme je lepsi to
udelat v potomku po TCustomPanel
procedure FormCreate(Sender: TObject);
private
FTME:TTRACKMOUSEEVENT;
procedure NewPanelWndProc(var AMsg:TMessage);
var
Form1: TForm1;
OldPanelWndProc:TWndMethod;
procedure TForm1.FormCreate(Sender: TObject);
begin
FTME.cbSize := sizeof(TTRACKMOUSEEVENT);
FTME.dwFlags := TME_LEAVE;
FTME.dwHoverTime := HOVER_DEFAULT;
FTME.hwndTrack := Panel1.Handle;
if not TrackMouseEvent(FTME) then
ShowMessage('Chyba');
OldPanelWndProc := Panel1.WindowProc;
Panel1.WindowProc := NewPanelWndProc;
end;
procedure TForm1.NewPanelWndProc(var AMsg:TMessage);
const TrackLeave:boolean = false;
const TrackHover:boolean = true;
begin
case AMsg.Msg of
WM_MOUSEMOVE :
begin
if not TrackLeave then
begin
TrackLeave := true;
FTME.cbSize := sizeof(TTRACKMOUSEEVENT);
FTME.dwFlags := TME_LEAVE;
FTME.dwHoverTime := HOVER_DEFAULT;
FTME.hwndTrack := Panel1.Handle;
if not TrackMouseEvent(FTME) then
ShowMessage('Chyba');
end;
if TrackHover then
begin
Panel1.Cursor := crHandPoint;
TrackHover := false;
end;
end;
WM_MOUSELEAVE :
begin
Panel1.Cursor := crDefault;
TrackLeave := false;
TrackHover := true;
end;
end;
OldPanelWndProc(AMsg);
end;
S pozdravem
Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644
Odpovedá: Petr Vones
12. 10. 2002 20:10
From: "Sula Milos" <milos.sula@oku-su.cz>
> Nevite nekdo zda se daji messages pro VCL komponenty zachytavat i primo
> v projektu bez toho aniz bych dopisoval obsluzny event primo do te
> komponenty ?
Pokud je formular parentem te komponety (tedy dana komponenta neni umistena
napriklad na TPanelu) tak muzes zpravy CM_MOUSELEAVE/ENTER odchytavat primo ve
formulari, LParam obsahuje instanci komponenty. Napriklad pro TButton:
TForm1 = class(TForm)
Button1: TButton;
private
protected
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
if TComponent(Message.LParam) = Button1 then
Button1.Font.Style := [fsBold];
end;
procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
if TComponent(Message.LParam) = Button1 then
Button1.Font.Style := [];
end;
Petr Vones